﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using DataAccessComponents;
using System.Collections.ObjectModel;

namespace BusinessLogicLayer
{
    public class RezerwacjaBL : IBusinessLogicLayer<Rezerwacja>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodająca
        /// </summary>
        /// <param name="objDodaj">Obiekt do dodania</param>
        /// <returns>Ideks dodanego wiersza</returns>
        public int dodaj(Rezerwacja objDodaj)
        {
            int id_rezerwacji = dal.dodajRezerwacja(objDodaj);
           

            return id_rezerwacji;
            }

        /// <summary>
        /// Funkcja usuwająca
        /// </summary>
        /// <param name="idusun">Id obiektu do usuniecia</param>        
        public void usun(int idusun)
        {
            dal.usunRezerwacja(idusun);
        }

        /// <summary>
        /// Funkcja aktualizująca podany obiekt w bazie danych
        /// </summary>
        /// <param name="objAktualizuj">Obiekt zaktualizowany</param>
        public void aktualizuj(Rezerwacja objAktualizuj)
        {

            KlientBL klientBL = new KlientBL();
            TerminBL terminBL = new TerminBL();
            
            if (objAktualizuj.Id_klient != 0)
            {
                objAktualizuj.Klient = klientBL.pobierz(objAktualizuj.Id_klient);
                klientBL.aktualizuj(objAktualizuj.Klient);
            }
            
            objAktualizuj.Termin = terminBL.pobierz(objAktualizuj.Id_termin);
            terminBL.aktualizuj(objAktualizuj.Termin);
            objAktualizuj.Numer_rezerwacji = String.Format("R-{0}-{1}", DateTime.Now.Year, objAktualizuj.Id_rezerwacja);
            dal.aktualizujRezerwacja(objAktualizuj);
        }

        /// <summary>
        /// Funkcja zwracająca obiekt o podanym id
        /// </summary>
        /// <param name="idpobierz">Id obiektu do zwrocenia</param>
        /// <returns></returns>
        public Rezerwacja pobierz(int idpobierz)
        {
            Rezerwacja rezerwacja =  dal.pobierzRezerwacja(idpobierz);

            KlientBL klientBL = new KlientBL();
            TerminBL terminBL = new TerminBL();
            OddzialBL oddzialBL = new OddzialBL();

            rezerwacja.Klient = klientBL.pobierz(rezerwacja.Id_klient);
            rezerwacja.Termin = terminBL.pobierz(rezerwacja.Id_termin);
            rezerwacja.Oddzial = oddzialBL.pobierz(rezerwacja.Id_oddzial);

            return rezerwacja;
        }

        /// <summary>
        /// Funkcja zwraca liste obiektów
        /// </summary>
        /// <returns>Lista obiektów</returns>
        public ObservableCollection<Rezerwacja> pobierzListe()
        {

            ObservableCollection<Rezerwacja> lista = dal.pobierzListeRezerwacja();
            KlientBL klientBL = new KlientBL();
            TerminBL terminBL = new TerminBL();
            OddzialBL oddzialBL = new OddzialBL();
            foreach (Rezerwacja rezerwacja in lista)
            {
                rezerwacja.Klient = klientBL.pobierz(rezerwacja.Id_klient);
                rezerwacja.Termin = terminBL.pobierz(rezerwacja.Id_termin);
                rezerwacja.Oddzial = oddzialBL.pobierz(rezerwacja.Id_oddzial);
            }
            return lista;
        }

        /// <summary>
        /// Funkcja zwraca liste obiektów okreslonego parametru
        /// </summary>
        /// <returns>Lista obiektów</returns>
        public ObservableCollection<Rezerwacja> pobierzListe(int idtermin)
        {
            ObservableCollection<Rezerwacja> lista = dal.pobierzListeRezerwacja(idtermin);
            KlientBL klientBL = new KlientBL();
            TerminBL terminBL = new TerminBL();
            OddzialBL oddzialBL = new OddzialBL();
            foreach (Rezerwacja rezerwacja in lista)
            {
                rezerwacja.Klient = klientBL.pobierz(rezerwacja.Id_klient);
                rezerwacja.Termin = terminBL.pobierz(rezerwacja.Id_termin);
                rezerwacja.Oddzial = oddzialBL.pobierz(rezerwacja.Id_oddzial);
            }
            return lista;
        }

        /// <summary>
        /// Funkcja aktualizująca obiekty w bazie obiektami z listy
        /// </summary>
        /// <param name="lista">Lista obiektow</param>
        /// <returns>True gdy operacja przebiegła poprawnie</returns>
        public bool aktualizujListe(ObservableCollection<Rezerwacja> lista)
        {
            KlientBL klientBL = new KlientBL();
            TerminBL terminBL = new TerminBL();
            
            foreach (Rezerwacja rezerwacja in lista)
            {
                if (rezerwacja.Id_rezerwacja == 0)
                {
                    this.dodaj(rezerwacja);
                }
                else
                {
                    this.aktualizuj(rezerwacja);
                    klientBL.aktualizuj(rezerwacja.Klient);
                    terminBL.aktualizuj(rezerwacja.Termin);
                }
            }
            return true;
        }

        /// <summary>
        /// Funkcja usuwa obiekt z bazy danych na podstawie obiektów z listy
        /// </summary>
        /// <param name="lista">Lista obiektów do usuniecia</param>
        /// <returns>True gdy operacja przebiegła poprawnie</returns>
        public bool usun(ObservableCollection<Rezerwacja> lista)
        {
            Klient_RezerwacjaBL kr = new Klient_RezerwacjaBL();
            
            foreach (Rezerwacja rezerwacja in lista)
            {
                ObservableCollection<Klient_Rezerwacja> listaKlientow = kr.pobierzListe(rezerwacja.Id_rezerwacja);
                kr.usun(listaKlientow);

                if (rezerwacja.Id_rezerwacja != 0)
                    this.usun(rezerwacja.Id_rezerwacja);
            }
            return true;            
        }

       
    }
}
